import PubSub from 'pubsub-js';
import momnet from 'moment';
import request from '../../../Utils/request';
// 获取全局实例
const appInstance = getApp();

Page({
	/**
	 * 页面的初始数据
	 */
	data: {
		isPlay: false, // 音乐是否播放
		song: {}, // 歌曲详情
		musicId: '', // 音乐id
		musicLink: '', // 音乐链接
		currentTime: '00:00', // 实时时间
		durationTime: '00:00', // 总时长
		currentWidth: 0, // 实时进度条的宽度
	},

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: function (options) {
		// options: 接收路由跳转的 query 参数
		// 原生小程序中路由传参，长度有限制
		let musicId = options.musicId;
		this.setData({
			musicId,
		});
		this.getMusicInfo(musicId);
		/**
		 * 问题：如果用户操作系统的控制音乐/暂停按钮，页面不知道，导致页面是否播放的状态和真实播放状态不一致
		 *  1. 通过控制音频的实例去监视 backAudioManager 播放/暂停
		 **/
		// 判断当前页面音乐是否在播放
		if (appInstance.globalData.isMusicPlay && appInstance.globalData.musicId === musicId) {
			// 修改当前页面播放状态
			this.setData({
				isPlay: true,
			});
		}
		// 创建音频实例
		this.backgroundAudioManager = wx.getBackgroundAudioManager();
		// 监视音频播放/暂停
		this.backgroundAudioManager.onPlay(() => {
			this.changePlayState(true);
			/* // 修改音乐播放状态
			this.setData({
				isPlay: true,
			}); */
			// 修改全局音乐播放状态
			// appInstance.globalData.isMusicPlay = true;
			appInstance.globalData.musicId = musicId;
		});
		this.backgroundAudioManager.onPause(() => {
			// 修改音乐播放状态
			this.changePlayState(false);
		});
		this.backgroundAudioManager.onStop(() => {
			// 修改音乐播放状态
			this.changePlayState(false);
		});
		// 监听播放进度
		this.backgroundAudioManager.onTimeUpdate(() => {
			// 函数体

			// 格式化 实时播放时间
			let currentTime = momnet(this.backgroundAudioManager.currentTime * 1000).format('mm:ss');
			let currentWidth = (this.backgroundAudioManager.currentTime / this.backgroundAudioManager.duration) * 450;
			this.setData({
				currentTime,
				currentWidth,
			});
		});
		this.backgroundAudioManager.onEnded(() => {
			// 自动切换至下一首 且自动播放
			// 发布消息数据给 recommendSong
			PubSub.publish('switchType', 'next');
			// 订阅来之 recommendSong 发布的 musicId
			PubSub.subscribe('musicId', (msg, musicId) => {
				// 获取歌曲详情
				this.getMusicInfo(musicId);
				this.setData({
					musicId,
				});
				// 自动播放当前音乐
				this.musicControl(true, musicId);
				// 取消订阅  或者 放到 onlaod 中
				PubSub.unsubscribe('musicId');
			});
			// 实时进度还原为0
			this.setData({
				currentWidth: 0,
				currentWidth: '00:00',
			});
		});
	},
	// 修改播放的状态
	changePlayState(isPlay) {
		// 修改音乐播放状态
		this.setData({
			isPlay: isPlay,
		});
		// 修改全局音乐播放状态
		appInstance.globalData.isMusicPlay = isPlay;
	},

	// 获取歌曲详情
	async getMusicInfo(musicId) {
		let songData = await request('/song/detail', { ids: musicId });
		// let currentTime = songData.songs[0].dt;
		// 单位 毫秒
		let durationTime = momnet(songData.songs[0].dt).format('mm:ss');
		this.setData({
			song: songData.songs[0],
			durationTime,
		});
		// 动态修改窗口标题
		wx.setNavigationBarTitle({
			title: this.data.song.name,
		});
	},

	// 点击播放/暂停的回调
	handleMusicPlay() {
		let isPlay = !this.data.isPlay;
		// 修改是否播放 上面监听过 所以不需要
		/* this.setData({
			isPlay,
		}); */
		let { musicId, musicLink } = this.data;
		this.musicControl(isPlay, musicId, musicLink);
	},

	// 控制音乐播放/暂停的功能函数
	async musicControl(isPlay, musicId, musicLink) {
		if (isPlay) {
			// 播放
			if (!musicLink) {
				// 获取音乐链接
				let musicLinkData = await request('/song/url/', { id: musicId });
				musicLink = musicLinkData.data[0].url;
				this.setData({
					musicLink,
				});
			}
			// properties(Read only)(duration,currentTime,paused,buffered)
			// properties(src(m4a, aac, mp3, wav),startTime,title,epname,singer,coverImgUrl,webUrl,protocol)
			this.backgroundAudioManager.src = musicLink;
			this.backgroundAudioManager.title = this.data.song.name;
		} else {
			// 暂停
			this.backgroundAudioManager.pause();
		}
	},

	// 点击切歌的回调
	handleSwitch(event) {
		// 获取切歌类型
		let type = event.currentTarget.id;
		// 关闭当前播放的音乐
		this.backgroundAudioManager.stop();
		// 订阅来之 recommendSong 发布的 musicId
		PubSub.subscribe('musicId', (msg, musicId) => {
			// 获取歌曲详情
			this.getMusicInfo(musicId);
			this.setData({
				musicId,
			});
			// 自动播放当前音乐
			this.musicControl(true, musicId);
			// 取消订阅  或者 放到 onlaod 中
			PubSub.unsubscribe('musicId');
		});
		// 发布消息数据给 recommendSong
		PubSub.publish('switchType', type);
	},

	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady: function () {},

	/**
	 * 生命周期函数--监听页面显示
	 */
	onShow: function () {},

	/**
	 * 生命周期函数--监听页面隐藏
	 */
	onHide: function () {},

	/**
	 * 生命周期函数--监听页面卸载
	 */
	onUnload: function () {},

	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh: function () {},

	/**
	 * 页面上拉触底事件的处理函数
	 */
	onReachBottom: function () {},

	/**
	 * 用户点击右上角分享
	 */
	onShareAppMessage: function () {},
});
